package com.tensai.study.java.features.JDK8.函数式编程;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * Java8四大内置函数式接口
 * <p>
 * 如果使用lambda还要自己写一个接口的话太麻烦，所以Java自己提供了一些接口：
 */
public class BuiltInFunctionalInterface {

    public static void main(String[] args) {

    }

    /**
     * Consumer 消费性接口：void accept(T t)；
     * 有一个参数，并且无返回值
     */
    public static void test1() {
        //这个e就代表所实现的接口的方法的参数，
        Consumer<String> consumer = e -> System.out.println("Lambda 表达式方式，" + e);
        consumer.accept("传入参数");
    }

    /**
     * Supplier供给型接口： T get();
     *
     * @param num num
     * @param sup 供给函数接口
     * @return return
     */
    private static ArrayList<Integer> getNumList(int num, Supplier<Integer> sup) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Integer e = sup.get();
            list.add(e);
        }
        return list;
    }

    public static void test2() {
        ArrayList<Integer> res = getNumList(10, () -> (int) (Math.random() * 100));
        System.out.println(res);
    }

    /**
     * Function 函数式接口：R apply(T t);
     *
     * @param str 参数
     * @param fun 处理方法
     * @return 处理结果
     */
    private static String strHandler(String str, Function<String, String> fun) {
        return fun.apply(str);
    }

    public void test3() {
        String newStr = strHandler("abc", String::toUpperCase);
        System.out.println(newStr);
        newStr = strHandler("  abc  ", String::trim);
        System.out.println(newStr);
    }

    /**
     * Predicate 断言式接口：boolean test(T t);
     *
     * @param list 列表
     * @param pre  处理方法
     * @return 返回
     */
    private static List<String> filterStr(List<String> list, Predicate<String> pre) {
        ArrayList<String> arrayList = new ArrayList<>();
        for (String str : list) {
            if (pre.test(str)) {
                arrayList.add(str);
            }
        }
        return arrayList;
    }

    public static void test4() {
        List<String> list = Arrays.asList("hello", "jiangshuying", "lambda", "www", "ok", "q");
        //判断一些字符串数组判断长度>2的字符串:
        List<String> ret = filterStr(list, (str) -> str.length() > 2);
        System.out.println(ret);
    }

}
